/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import model.Ansat;
import model.Faktura;
import model.FaktureretVare;
import model.Kasse;
import model.Vare;
import model.Varegruppe;
import view.GUI;

/**
 *
 * @author Morten J, Morten B & Jonas
 */
public class KasseHandler {

    private Kasse kasse;
    private final Date currentDate;
    private ResultSet rs;
    private final String formattedDate;
    private final SimpleDateFormat dateFormat;
    private boolean state;
    private ArrayList<FaktureretVare> kasseFaktureretVare;
    private ArrayList<Faktura> kasseFakturaList;
    private final SimpleDateFormat dateFormatToText;
    private ArrayList<Vare> vareListe;

    public KasseHandler() {
	state = false;
	currentDate = new Date();
	dateFormat = new SimpleDateFormat("yyyy-MM-dd");
	dateFormatToText = new SimpleDateFormat("dd-MM-yyyy");
	formattedDate = dateFormat.format(currentDate);
    }

    public boolean isKasseFound() {
	String sql = "SELECT * FROM kasse WHERE kasseDato = '" + formattedDate + "'";
	try {
	    rs = Main.getDbConnection().select(sql);
	    if (rs.next() && !state) {
		state = true;
	    }
	} catch (SQLException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved indlæsning af kasse");
	}
	return state;
    }

    public Kasse getKasse() {
	return kasse;
    }

    public void closeKasse() {
	kasse.setKasseOptalt(true);
    }

    public void saveKasseToDB() {
	String sql = "UPDATE kasse SET kasseOptalt = true WHERE kasseDato = '" + formattedDate + "'";
	try {
	    Main.getDbConnection().update(sql);
	} catch (SQLException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved lagring af kasse");
	}
    }

    public void createKasse(double startKr, double startEu) {
	if (!isKasseFound()) {
	    kasse = new Kasse(currentDate, startKr, startEu, startKr, startEu, false);
	    String sql = "INSERT INTO kasse VALUES('" + formattedDate + "', " + startKr + ", " + startEu + ", " + startKr + ", " + startEu + ", 0, 0, " + false + ")";
	    try {
		Main.getDbConnection().insert(sql);
	    } catch (SQLException ex) {
		GUI.getGuiHandler().setFeedbackMessage(" ved oprettelse af kasse");
	    }
	}
    }

    public void createKasseObject() {
	String sql = "SELECT * FROM kasse WHERE kasseDato = '" + formattedDate + "'";
	try {
	    rs = Main.getDbConnection().select(sql);
	    if (rs.next()) {
		kasse = new Kasse(rs.getDate("kasseDato"), rs.getDouble("startKr"), rs.getDouble("startEu"), rs.getDouble("aktuelKr"), rs.getDouble("aktuelEu"), rs.getBoolean("kasseOptalt"));
	    }
	} catch (SQLException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved indlæsning af kasse");
	}
    }

    public void updateKasse(double income, int betalingstype) {
	String sql;
	if (betalingstype == 2) {
	    kasse.setAktuelEu(kasse.getAktuelEu() + income);
	    sql = "UPDATE kasse SET aktuelEu = " + kasse.getAktuelEu() + " where kasseDato = '" + formattedDate + "'";
	} else {
	    kasse.setAktuelKr(kasse.getAktuelKr() + income);
	    sql = "UPDATE kasse SET aktuelKr = " + kasse.getAktuelKr() + " where kasseDato = '" + formattedDate + "'";
	}
	try {
	    Main.getDbConnection().update(sql);
	} catch (SQLException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved opdatering af kasse");
	}
    }

    public void updateOptaltKasse(double optaltKr, double optaltEu) {
	String sql = "UPDATE kasse SET optaltKr = '" + optaltKr + "', optaltEu = '" + optaltEu + "' WHERE kasseDato = '" + formattedDate + "'";
	try {
	    Main.getDbConnection().update(sql);
	} catch (SQLException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved opdatering af kasse");
	}
    }

    public void createKasseRapport() {
	String sql = "SELECT * from faktura right outer join faktureretVare on fakturaNr = fk_fakturaNr "
		+ "left outer join vare on fk_vareNr = varenr "
		+ "left outer join ansat on fk_ansatNr = ansatNr "
		+ "left outer join bytabel on fk_postNr = postNr "
		+ "where date_format(from_unixtime(fakturaDato), '%Y-%m-%d') = '" + formattedDate
		+ "' order by fakturaNr";
	try {
	    rs = Main.getDbConnection().select(sql);
	    int currentFakturaID = 0;
	    ArrayList<Integer> telefonListe = new ArrayList<>();
	    kasseFakturaList = new ArrayList<>();
	    kasseFaktureretVare = new ArrayList<>();
	    vareListe = new ArrayList<>();
	    Varegruppe varegruppe = null;
	    while (rs.next()) {
		for (Varegruppe vg : VaregruppeHandler.getVareGruppeListe()) {
		    if (rs.getInt("fk_vareGruppe") == vg.getVareGruppeNr()) {
			varegruppe = vg;
		    }
		}
		Vare vare = new Vare(rs.getInt("vareNr"), rs.getString("vareNavn"),
			rs.getString("leverandoer"), rs.getDouble("salgsPrisKr"),
			rs.getDouble("salgsPrisEu"), rs.getBoolean("medlemspris"),
			rs.getInt("rabat"), rs.getInt("vareBeholdning"),
			rs.getBoolean("aktuel"), varegruppe);
		
		FaktureretVare ftVare = new FaktureretVare(rs.getInt("antal"),
			rs.getDouble("prisHistorikKr"), rs.getDouble("prisHistorikEu"), vare);

		Ansat ansat = new Ansat(rs.getInt("ansatNr"), rs.getString("fNavn"),
			rs.getString("eNavn"), rs.getString("adresse"),
			rs.getInt("postNr"), rs.getString("byNavn"), telefonListe, rs.getString("kodeord"));

		if (rs.getInt("fakturaNr") != currentFakturaID || currentFakturaID == 0) {
		    kasseFaktureretVare = new ArrayList<>();
		    Faktura faktura = new Faktura(rs.getInt("fakturaNr"), ansat, kasseFaktureretVare);
		    faktura.setMedlem(rs.getBoolean("medlem"));
		    faktura.setBetalingsType(rs.getInt("betalingsType"));
		    long dato = rs.getLong("fakturaDato");
		    faktura.setDato(dato);
		    kasseFakturaList.add(faktura);
		}
		kasseFaktureretVare.add(ftVare);
		currentFakturaID = rs.getInt("fakturaNr");
	    }
	} catch (SQLException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved indlæsning af kasserapport");
	} catch (NullPointerException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved indlæsning af kasserapport");
	}

	String fakturaToSave = "Kasserapport d. " + dateFormatToText.format(currentDate)
		+ ":\n\nStartbeholdning i kroner: " + kasse.getStartKr()
		+ "\nStartbeholdning i euro: " + kasse.getStartEu()
		+ "\n\nSamlet salg i kroner: " + TextRegler.roundDouble(kasse.getAktuelKr() - kasse.getStartKr())
		+ "\nSamlet salg i euro: " + TextRegler.roundDouble(kasse.getAktuelEu() - kasse.getStartEu())
		+ "\n\nOptalt kassebeholdning i kroner: " + kasse.getOptaltKr() + " kr."
		+ "\n\tDifference: " + TextRegler.roundDouble(kasse.getOptaltKr() - kasse.getAktuelKr()) + " kr."
		+ "\n\nOptalt kassebeholdning i euro: " + kasse.getOptaltEu() + " €"
		+ "\n\tDifference: " + TextRegler.roundDouble(kasse.getOptaltEu() - kasse.getAktuelEu()) + " €"
		+ "\n\nFakturaoversigt: \n";
	try {
	    for (Faktura faktura : kasseFakturaList) {
		fakturaToSave = fakturaToSave + "\n" + faktura + "\n";
	    }
	    saveKasseRapportToText(fakturaToSave);
	} catch (NullPointerException ex) {
	    GUI.getGuiHandler().setFeedbackMessage(" ved indlæsning af kasserapport");
	}
    }

    public void saveKasseRapportToText(String fakturaToSave) {
	try {
	    String filename = "Kasserapport d. " + dateFormatToText.format(currentDate);
	    File file = new File(filename + ".doc");
	    try (PrintWriter pw = new PrintWriter(file)) {
		pw.print(fakturaToSave);
	    }
	} catch (IOException ex) {
	    GUI.getGuiHandler().setFeedbackMessage("Det var ikke muligt at gemme kasserapporten på computeren.", Main.getRED_COLOR());
	}
	try {
	    Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler" + " Kasserapport d. " + dateFormatToText.format(currentDate) + ".doc");
	} catch (IOException ex) {
	    GUI.getGuiHandler().setFeedbackMessage("Åbning af kasserapport mislykkedes. Åbn filen manuelt, fra den lokale folder.", Main.getRED_COLOR());
	}
    }
}
